/*
提交链接:https://leetcode.cn/problems/minimum-swaps-to-group-all-1s-together-ii/description/
2134. 最少交换次数来组合所有的 1 II
赖德檀 2024/12/13
*/

class Solution {
public:
// 数出一共有多少个 1
// 使用滑动窗口，以 1 的总数为窗口大小
// 计算窗口内 0 的个数，最少的即为需要交换的次数
    int minSwaps(vector<int>& nums) {
        int n=nums.size(),num=0,ans=INT_MAX;
        for(int i:nums)
        num+=i;//统计1的个数
        int l=0,r=0,count=0;
        while(r<num-1)
        count+=nums[r++];//让右边界达到num-1,使窗口长度为num,同时统计窗口内1的数量
        while(l<n)//环形数组，l达到n处才能表示结束
        {
            count+=nums[r++%n];
            ans=min(ans,num-count);//sum-count：窗口内0的个数
            count-=nums[l++];//左边界右移
        }
        return ans;
    }
};